home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / tool-inc.zip / DISPLN.INC < prev    next >
Text File  |  1989-06-02  |  5KB  |  226 lines

  1.  
  2. (*
  3.  * Copyright 1987, 1989 Samuel H. Smith;  All rights reserved
  4.  *
  5.  * This is a component of the ProDoor System.
  6.  * Do not distribute modified versions without my permission.
  7.  * Do not remove or alter this notice or any other copyright notice.
  8.  * If you use this in your own program you must distribute source code.
  9.  * Do not use any of this in a commercial product.
  10.  *
  11.  *)
  12.  
  13. (*
  14.  * displn - utility library for fast string display
  15.  * Written by Samuel H. Smith, 7-Feb-86 (rev. 23-apr-87)
  16.  *
  17.  *)
  18.  
  19. const
  20.    low_attr:         integer = 7;
  21.    norm_attr:        integer = 15;
  22.    back_attr:        integer = 0;
  23.    default_disp_seg: integer = $B800;
  24.    slowdisplay:      boolean = false;
  25.  
  26. type
  27.    popup_string = string[255];
  28.  
  29.    screenloc =         record
  30.          character:          char;
  31.          attribute:          byte;
  32.    end;
  33.    videoram =          array [0..1999] of screenloc;
  34.    videoptr =          ^videoram;
  35.  
  36.    window_rec = record
  37.       x1,y1,x2,y2: integer;
  38.       attr:        byte;
  39.    end;
  40.  
  41.    registers =     record
  42.          ax, bx, cx, dx, bp, si, di, ds, es, flags:         integer;
  43.    end;
  44.  
  45. var
  46.    cur_window:   window_rec;
  47.    disp_mem:     videoptr;
  48.    disp_seg:     integer;
  49.  
  50.  
  51. procedure normvideo;
  52. begin
  53.    textcolor(norm_attr);
  54.    textbackground(back_attr);
  55.    cur_window.attr := norm_attr + back_attr shl 4;
  56. end;
  57.  
  58. procedure lowvideo;
  59. begin
  60.    textcolor(low_attr);
  61.    textbackground(back_attr);
  62.    cur_window.attr := low_attr + back_attr shl 4;
  63. end;
  64.  
  65. procedure old_window(x1,y1,x2,y2: integer);  {redefine the old window
  66.                                               command so it can still be
  67.                                               used by other procs}
  68. begin
  69.    window(x1,y1,x2,y2);
  70. end;
  71.  
  72. procedure window(a1,b1,a2,b2: integer);    {make a new version of window
  73.                                             that saves the current state}
  74. begin
  75.    with cur_window do
  76.    begin
  77.       x1 := a1; y1 := b1;
  78.       x2 := a2; y2 := b2;
  79.       old_window(x1,y1,x2,y2);
  80.    end;
  81. end;
  82.  
  83. function invisible: boolean;   {is this the invisible program under doubledos?}
  84. var
  85.    reg:  registers;
  86. begin
  87.    reg.ax := $e400;   {doubledos return program status}
  88.    msdos(reg);
  89.    invisible := (lo(reg.ax) = 2) or slowdisplay;
  90. end;
  91.  
  92.  
  93. procedure disp (s:                  popup_string);
  94.                                      {very fast dma string display}
  95. var
  96.    index:              integer;
  97.    i:                  integer;
  98.    c:                  char;
  99.    len:                integer;
  100.    max_index:          integer;
  101.  
  102. begin
  103.    len := ord(s[0]);     {length (s);}
  104.  
  105.    if invisible or (len < 4) then
  106.                      {can't do dma screens if invisble under doubledos.
  107.                       this is slower than write for short strings}
  108.    begin
  109.       write(s);
  110.       exit;
  111.    end;
  112.  
  113.    with cur_window do
  114.    begin
  115.       disp_mem := ptr(disp_seg,0);
  116.  
  117.       index :=(wherey + y1 - 2)* 80 +(wherex + x1 - 2);
  118.       max_index := y2*80;
  119.  
  120.       for i := 1 to len do
  121.       begin
  122.          c := s [i];
  123.  
  124.          case c of
  125.             ^H:   index := index - 1;
  126.  
  127.             ^J:   begin
  128.                      index := index + 80;
  129.                      if index >= max_index then
  130.                      begin
  131.                         write(^J);
  132.                         index := index - 80;
  133.                      end;
  134.                   end;
  135.  
  136.             ^M:   index := (index div 80)* 80 + x1 - 1;
  137.  
  138.             ^G:   write(^G);
  139.  
  140.             else  begin
  141.                      with disp_mem^[index] do
  142.                      begin
  143.                         character := c;
  144.                         attribute := attr;
  145.                      end;
  146.  
  147.                      index := succ(index);
  148.  
  149.                      if index >= max_index then
  150.                      begin
  151.                         index := index - 80;
  152.                         writeln;
  153.                      end;
  154.                   end;
  155.          end;
  156.       end;
  157.  
  158.  
  159. (* place cursor at end of displayed string *)
  160.  
  161.       gotoxy((index mod 80)- x1 + 2,(index div 80)- y1 + 2);
  162.    end;
  163. end;
  164.  
  165. procedure displn(s: popup_string);       {fast display and linefeed}
  166. begin
  167.    disp(s);
  168.    writeln;
  169. end;
  170.  
  171. procedure init_disp;     {call once before anything else in this library}
  172. begin
  173.    disp_seg := default_disp_seg;   {this needs to check for mono}
  174.    window(1,1,80,25);
  175.    normvideo;
  176. end;
  177.  
  178. (***** demo main program - delete when this is used as a library ***)
  179.  
  180. var
  181.    i: integer;
  182.  
  183. begin
  184.    clrscr;
  185.    for i := 1 to 24 do
  186.    begin
  187.       gotoxy(1,i);
  188.       write(i:2);
  189.       write('--Testing slow string display calls');
  190.    end;
  191.  
  192.    window(40,5,80,20);
  193.    for i := 1 to 14 do
  194.    begin
  195.       gotoxy(1,i);
  196.       write(i:2);
  197.       write('--Testing slow string display calls');
  198.    end;
  199.  
  200.    window(1,1,80,25);
  201.    delay(1000);
  202.  
  203.    init_disp;
  204.    clrscr;
  205.  
  206.    for i := 1 to 24 do
  207.    begin
  208.       gotoxy(1,i);
  209.       write(i:2);
  210.       disp('--Testing fast string display calls');
  211.    end;
  212.  
  213.    window(40,5,80,20);
  214.    for i := 1 to 14 do
  215.    begin
  216.       gotoxy(1,i);
  217.       write(i:2);
  218.       disp('--Testing fast string display calls');
  219.    end;
  220.  
  221.    window(1,1,80,25);
  222.    gotoxy(1,24);
  223. end.
  224.  
  225.  
  226.